﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml;
using NUnit.Framework;
using Sistema_Totem.Acceso_a_Datos.DAOS;
using Sistema_Totem.Clases;
using Sistema_Totem.Clases.Fabricas;
using Sistema_Totem.Logica.Fabricas;
using Sistema_Totem.Logica.Comandos;

namespace Sistema_Totem.Pruebas
{
    /// <summary>
    /// Etiqueta a la clase para casos de prueba
    /// </summary>
    [TestFixture]
    public class PruebaRequerimiento
    {
        #region Atributos
        
        private Comando<bool> comando;
        private Comando<List<Requerimiento>> comandoL;
        private int idProyecto = 1;
        private int idRequerimiento = 1;
        private Seccion seccion = new Seccion();
        private ElementoControl elemento = new ElementoControl();
        private ElementoControl elemento1 = new ElementoControl();
        private ElementoControl elemento2 = new ElementoControl();
        private Entidad req = FabricaEntidad.NuevoRequerimiento();

        #endregion Atributos

        #region Prueba Agregar Requerimiento

        /// <summary>
        /// Prueba que valida el método de agregar requerimiento.
        /// </summary>
        [Test]
        public void PAgregarRequerimiento()
        {
            elemento.Nombre = "nombre";
            elemento.Tipo = "TextBox";
            elemento.Estado = "Activo";
            elemento.Contenido = "Prueba";

            elemento1.Nombre = "tipo";
            elemento1.Tipo = "TextBox";
            elemento1.Estado = "Activo";
            elemento1.Contenido = "Funcional";

            elemento2.Nombre = "version";
            elemento2.Tipo = "TextBox";
            elemento2.Estado = "Activo";
            elemento2.Contenido = "1.0";

            seccion.Nombre = "Prueba";
            seccion.ListaControl.Add(elemento);
            seccion.ListaControl.Add(elemento1);
            seccion.ListaControl.Add(elemento2);

            (req as Requerimiento).Id = 1;
            (req as Requerimiento).IdProyecto = 2;
            (req as Requerimiento).ListaSeccion.Add(seccion);

            //Enviado los datos de la lógica para el acceso a los datos
            comando = FabricaComando.CrearComandoAgregarRequerimiento(req, idProyecto);
            comando.Ejecutar();

            //Assert que verifica que mi entidad no esta vacia
            Assert.IsNotNull(req);
            //Assert que verifica que los valores de mi 
            //entidad son los correctos
            Assert.IsTrue((req as Requerimiento).Id == 1);
            Assert.IsTrue((req as Requerimiento).IdProyecto == 2);
            Assert.IsTrue((req as Requerimiento).ListaSeccion[0].Nombre.ToString() == "Prueba");
            //Assert que verifica que la agregacion fue correcta.
            Assert.IsInstanceOf(typeof(Comando<bool>), comando);           
        }
        
        #endregion Prueba Agregar Requerimiento

        #region Prueba Modificar Requerimiento
        
        /// <summary>
        /// Prueba que la valida el método modificar requerimiento.
        /// </summary>
        [Test]
        public void PModificaRequerimiento()
        {
            elemento.Nombre = "nombre";
            elemento.Tipo = "TextBox";
            elemento.Estado = "Activo";
            elemento.Contenido = "Prueba";

            elemento1.Nombre = "tipo";
            elemento1.Tipo = "TextBox";
            elemento1.Estado = "Activo";
            elemento1.Contenido = "Funcional";

            elemento2.Nombre = "version";
            elemento2.Tipo = "TextBox";
            elemento2.Estado = "Activo";
            elemento2.Contenido = "1.0";

            seccion.Nombre = "Prueba";
            seccion.ListaControl.Add(elemento);
            seccion.ListaControl.Add(elemento1);
            seccion.ListaControl.Add(elemento2);

            (req as Requerimiento).Id = 1;
            (req as Requerimiento).IdProyecto = 1;
            (req as Requerimiento).ListaSeccion.Add(seccion);

            //Enviado los datos de la lógica para el acceso a los datos
            Comando<bool> comando = FabricaComando.
                CrearComandoModificarRequerimiento(req);
            comando.Ejecutar();

            //Assert que verifica que mi entidad no esta vacia
            Assert.IsNotNull(req);
            //Assert que verifica que los valores de mi 
            //entidad son los correctos
            Assert.IsTrue((req as Requerimiento).Id == 1);
            Assert.IsTrue((req as Requerimiento).IdProyecto == 1);
            Assert.IsTrue((req as Requerimiento).
                ListaSeccion[0].Nombre.ToString() == "Prueba");
            //Assert que verifica que la agregacion fue correcta.
            Assert.IsInstanceOf(typeof(Comando<bool>), comando);
        }

        #endregion Prueba Modificar Requerimiento

        #region Prueba Eliminar Requerimiento

        /// <summary>
        /// Prueba que valida el metodo de eliminar requerimiento.
        /// </summary>
        [Test]
        public void PEliminarRequerimiento()
        {
            elemento.Nombre = "nombre";
            elemento.Tipo = "TextBox";
            elemento.Estado = "Activo";
            elemento.Contenido = "Prueba";

            elemento1.Nombre = "tipo";
            elemento1.Tipo = "TextBox";
            elemento1.Estado = "Activo";
            elemento1.Contenido = "Funcional";

            elemento2.Nombre = "version";
            elemento2.Tipo = "TextBox";
            elemento2.Estado = "Activo";
            elemento2.Contenido = "1.0";

            seccion.Nombre = "Prueba";
            seccion.ListaControl.Add(elemento);
            seccion.ListaControl.Add(elemento1);
            seccion.ListaControl.Add(elemento2);

            (req as Requerimiento).Id = 1;
            (req as Requerimiento).IdProyecto = 1;
            (req as Requerimiento).ListaSeccion.Add(seccion);

            //Enviado los datos de la lógica para el acceso a los datos
            Comando<bool> comando = FabricaComando.
                CrearComandoEliminarRequerimiento(idRequerimiento);
            comando.Ejecutar();

            //Assert que verifica que mi entidad no esta vacia
            Assert.IsNotNull(req);
            //Assert que verifica que los valores de mi 
            //entidad son los correctos
            Assert.IsTrue((req as Requerimiento).Id == 1);
            Assert.IsTrue((req as Requerimiento).IdProyecto == 1);
            Assert.IsTrue((req as Requerimiento).
                ListaSeccion[0].Nombre.ToString() == "Prueba");
            //Assert que verifica que la eliminacion fue correcta.
            Assert.IsInstanceOf(typeof(Comando<bool>), comando);            
        }
        
        #endregion Prueba Eliminar Requerimiento

        #region Prueba Consultar Requrimiento
        
        /// <summary>
        /// Prueba que valida el método de consultar requerimiento.
        /// </summary>
        [Test]
        public void PConsultarRequerimiento()
        {
            elemento.Nombre = "nombre";
            elemento.Tipo = "TextBox";
            elemento.Estado = "Activo";
            elemento.Contenido = "Prueba";

            elemento1.Nombre = "tipo";
            elemento1.Tipo = "TextBox";
            elemento1.Estado = "Activo";
            elemento1.Contenido = "Funcional";

            elemento2.Nombre = "version";
            elemento2.Tipo = "TextBox";
            elemento2.Estado = "Activo";
            elemento2.Contenido = "1.0";

            seccion.Nombre = "Prueba";
            seccion.ListaControl.Add(elemento);
            seccion.ListaControl.Add(elemento1);
            seccion.ListaControl.Add(elemento2);

            (req as Requerimiento).Id = 1;
            (req as Requerimiento).IdProyecto = 1;
            (req as Requerimiento).ListaSeccion.Add(seccion);

            //Enviado los datos de la lógica para el acceso a los datos
            comandoL = FabricaComando.
                CrearComandoConsultarRequerimiento(idProyecto);
            comando.Ejecutar();

            //Assert que verifica que mi entidad no esta vacia
            Assert.IsNotNull(req);
            //Assert que verifica que los valores de mi 
            //entidad son los correctos
            Assert.IsTrue((req as Requerimiento).Id == 1);
            Assert.IsTrue((req as Requerimiento).IdProyecto == 1);
            Assert.IsTrue((req as Requerimiento).
                ListaSeccion[0].Nombre.ToString() == "Prueba");
            //Assert que verifica que la consulta fue correcta.
            Assert.IsInstanceOf(typeof(Comando<List<Requerimiento>>), comandoL);      
        }

        #endregion Prueba Consultar Requerimiento
    }
}